graph LR
A[Electrones Libres] --> B{Aceleración kVp}
B --> C[Choque en el Ánodo]
C --> D[Rayos X 1%]
C --> E[Calor 99%]
Ingeniería Biomédica
2026-02-09
La adquisición de imágenes por rayos X (RX) y tomografía computarizada (CT) puede modelarse como un sistema de transferencia de información donde el haz de fotones actúa como portador, el paciente como canal modulador y el detector como transductor.
La calidad diagnóstica final depende de la integridad de cada eslabón en la cadena de procesamiento.
La calidad de la fuente define el límite superior de la resolución espacial y la SNR inicial.
A continuación, presento la estructura de las diapositivas en Quarto utilizando un enfoque didáctico simplificado, pero manteniendo el rigor de las relaciones físicas fundamentales.
Imagine un acelerador de partículas en miniatura:
graph LR
A[Electrones Libres] --> B{Aceleración kVp}
B --> C[Choque en el Ánodo]
C --> D[Rayos X 1%]
C --> E[Calor 99%]
Ocurren dos fenómenos en el “muro” (ánodo):
El Número Atómico (\(Z\)) representa qué tan “denso” es el muro de átomos.
Los rayos X no son todos iguales; salen en una “mezcla”:
La Filtración: Colocamos una lámina de metal (Aluminio) para “limpiar” la mezcla y dejar pasar solo los rayos fuertes.
¿Por qué algunas radiografías se ven borrosas?
La Relación Señal-Ruido (SNR) es la limpieza de la imagen.
Para obtener una buena imagen necesitamos:
El paciente actúa como un filtro espacialmente variante definido por \(\mu(x, y, z, E)\).
graph LR
A[Generación Haz] --> B[Interacción Paciente]
B --> C[Detección Fotónica]
C --> D[Digitalización ADC]
D --> E[Procesamiento/Recon]
E --> F[Visualización]
El detector es el componente más crítico en la degradación de la resolución espacial y el ruido.
Transformación de la señal analógica continua en un dominio discreto.
Antes de la reconstrucción, los datos deben normalizarse.
En CT, se resuelve el problema inverso de la Transformada de Radon.
Mapeo de la profundidad de bits del detector a la capacidad del sistema visual humano.
Cierre del lazo de control de calidad.
La optimización de la calidad diagnóstica no puede realizarse de forma aislada. La integración de IA Confiable y IA Causal en las etapas 5 (calibración) y 6 (reconstrucción) es el paradigma actual para minimizar la dosis sin comprometer la interpretabilidad clínica.
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter
from skimage.exposure import rescale_intensity
def generate_phantom(size=512):
"""Genera un fantoma sintético con gradientes y estructuras de alta frecuencia."""
image = np.zeros((size, size))
# Gradiente para ver cuantización
xx, yy = np.mgrid[0:size, 0:size]
image = xx / size
# Estructuras circulares (baja y alta frecuencia)
for i in range(5):
r = 20 + i * 15
mask = (xx - 150) ** 2 + (yy - 150 - i * 60) ** 2 < r**2
image[mask] = 0.8 - (i * 0.1)
# Barras de resolución (alta frecuencia)
for i in range(10):
image[350:450, 200 + i * 20 : 210 + i * 20] = 1.0
return image
def simulate_mtf(image, sigma):
"""
Simula la degradación por MTF mediante la convolución con una PSF Gaussiana.
A mayor sigma, menor frecuencia de corte en la MTF.
"""
return gaussian_filter(image, sigma=sigma)
def simulate_quantization(image, bit_depth):
"""
Simula el proceso de cuantización del ADC.
"""
levels = 2**bit_depth - 1
quantized = np.round(image * levels) / levels
return quantized
# --- Parámetros de simulación ---
sigma_psf = 3.5 # Representa una MTF deficiente
bits_low = 3 # Cuantización extrema para visualización
# Procesamiento
original = generate_phantom()
blurred = simulate_mtf(original, sigma_psf)
quantized = simulate_quantization(original, bits_low)
combined = simulate_quantization(blurred, bits_low)
# Visualización
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
titles = [
"Original (Ideal - High Bit-depth/MTF)",
f"Degradación MTF ($\sigma$={sigma_psf})",
f"Cuantización ({bits_low} bits)",
"Cadena Combinada (MTF + Cuantización)",
]
images = [original, blurred, quantized, combined]
for ax, img, title in zip(axes.ravel(), images, titles):
im = ax.imshow(img, cmap="gray", vmin=0, vmax=1)
ax.set_title(title, fontsize=12, fontweight="bold")
ax.axis("off")
plt.tight_layout()
plt.show()